import {SQLiteDataType} from '../../types';

/**
 * 数据类型相关工具类
 */
export class DataTypeUtil {
  /**
   * 根据值获取对应的SQLite数据类型
   * @param value 要分析的值
   * @returns 对应的SQLite数据类型
   */
  static getTypeFromValue(value: any): SQLiteDataType {
    if (value === null || value === undefined) {
      return 'TEXT'; // 默认为TEXT类型
    }

    const valueType = typeof value;

    switch (valueType) {
      case 'boolean':
        return 'BOOLEAN';
      case 'number':
        // 整数用INTEGER，浮点数用REAL
        return Number.isInteger(value) ? 'INTEGER' : 'REAL';
      case 'string':
        return 'TEXT';
      case 'object':
        if (value instanceof Date) {
          return 'DATETIME';
        } else if (value instanceof Buffer || value instanceof Uint8Array) {
          return 'BLOB';
        } else {
          // 对象和数组转为JSON存储
          return 'TEXT';
        }
      default:
        return 'TEXT';
    }
  }

  /**
   * 根据多个值确定最合适的SQLite数据类型
   * 会分析所有值，并返回最合适的类型
   * @param values 要分析的值数组
   * @returns 最合适的SQLite数据类型
   */
  static getTypeFromValues(...values: any[]): SQLiteDataType {
    if (values.length === 0) {
      return 'TEXT'; // 默认为TEXT类型
    }

    // 过滤掉null和undefined
    const validValues = values.filter(value => value !== null && value !== undefined);

    if (validValues.length === 0) {
      return 'TEXT'; // 如果所有值都是null或undefined，默认为TEXT
    }

    // 检查是否所有值类型都相同
    const firstType = typeof validValues[0];
    const allSameType = validValues.every(value => typeof value === firstType);

    if (allSameType) {
      return this.getTypeFromValue(validValues[0]);
    }

    // 如果类型不一致，使用更通用的类型
    // 优先级：BLOB > TEXT > REAL > INTEGER > BOOLEAN
    if (validValues.some(value => value instanceof Buffer || value instanceof Uint8Array)) {
      return 'BLOB';
    }

    if (validValues.some(value => typeof value === 'string' || value instanceof Date || Array.isArray(value) || (typeof value === 'object' && value !== null))) {
      return 'TEXT';
    }

    if (validValues.some(value => typeof value === 'number' && !Number.isInteger(value))) {
      return 'REAL';
    }

    if (validValues.some(value => typeof value === 'number')) {
      return 'INTEGER';
    }

    return 'TEXT'; // 默认为TEXT类型
  }
}
